/******************************************************************************* * Copyright (c) 2010-2011 Sonatype, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * and Apache License v2.0 which accompanies this distribution. * The Eclipse Public License is available at * http://www.eclipse.org/legal/epl-v10.html * The Apache License v2.0 is available at * http://www.apache.org/licenses/LICENSE-2.0.html * You may elect to redistribute this code under either of these licenses. *******************************************************************************/ package org.sonatype.restsimple.sitebricks.test.addressBook; import com.google.inject.servlet.GuiceFilter; import com.ning.http.client.AsyncHttpClient; import com.ning.http.client.Response; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.servlet.DefaultServlet; import org.eclipse.jetty.servlet.ServletContextHandler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.sonatype.restsimple.common.test.addressbook.AddressBookAction; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import java.io.IOException; import java.net.ServerSocket; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; public class AddressBookSitebricksTest { private static final Logger logger = LoggerFactory.getLogger(AddressBookSitebricksTest.class); protected Server server; public int port; public String targetUrl; public String acceptHeader; protected int findFreePort() throws IOException { ServerSocket socket = null; try { socket = new ServerSocket(0); return socket.getLocalPort(); } finally { if (socket != null) { socket.close(); } } } @BeforeClass(alwaysRun = true) public void setUpGlobal() throws Exception { port = findFreePort(); server = new Server(port); acceptHeader = AddressBookAction.APPLICATION + "/" + AddressBookAction.JSON; targetUrl = "http://127.0.0.1:" + port; ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); context.setContextPath("/"); context.addFilter(GuiceFilter.class, "/*", 0); context.addEventListener(new AddressBookSitebricksConfig()); context.addServlet(DefaultServlet.class, "/"); server.setHandler(context); server.start(); logger.info("Local HTTP server started successfully"); } @AfterClass(alwaysRun = true) public void tearDown() throws Exception { server.stop(); } @Test(timeOut = 20000) public void testPut() throws Throwable { logger.info("running test: testPut"); AsyncHttpClient c = new AsyncHttpClient(); Response r = c.preparePut(targetUrl + "/createAddressBook/myBook").addHeader("Accept", acceptHeader).setBody("{\"entries\":\"foo - bar - \"}").execute().get(); assertNotNull(r); assertEquals(r.getStatusCode(), 201); c.close(); } @Test(timeOut = 20000) public void testPost() throws Throwable { logger.info("running test: testPost"); AsyncHttpClient c = new AsyncHttpClient(); c.preparePut(targetUrl + "/createAddressBook/myBook").addHeader("Accept", acceptHeader).setBody("test").setBody("{\"entries\":\"foo - bar - \"}").execute().get(); Response r = c.preparePost(targetUrl + "/updateAddressBook/myBook").addHeader("Accept", acceptHeader).addParameter("update","foo").addParameter("update2", "bar").execute().get(); assertNotNull(r); assertEquals(r.getStatusCode(), 200); c.close(); } @Test(timeOut = 20000) public void testInvalidPost() throws Throwable { logger.info("running test: testInvalidPost"); AsyncHttpClient c = new AsyncHttpClient(); Response r = c.preparePost(targetUrl + "/createAddressBook/myBook").addHeader("Accept", acceptHeader).addParameter("update","foo").addParameter("update2", "bar").execute().get(); assertNotNull(r); // TODO: Must return 406, not 500 -> Sitebricks exception try { assertEquals(r.getStatusCode(), 406); } catch (Throwable t) { assertEquals(r.getStatusCode(), 500); } c.close(); } @Test(timeOut = 20000) public void testGet() throws Throwable { logger.info("running test: testGet"); AsyncHttpClient c = new AsyncHttpClient(); c.preparePut(targetUrl + "/createAddressBook/myBook").addHeader("Accept", acceptHeader).setBody("{\"entries\":\"foo - bar - \"}").execute().get(); c.preparePost(targetUrl + "/updateAddressBook/myBook").addHeader("Accept", acceptHeader).addParameter("update","foo").addParameter("update2", "bar").execute().get(); Response r = c.prepareGet(targetUrl + "/getAddressBook/myBook").addHeader("Accept", acceptHeader).execute().get(); assertNotNull(r); assertEquals(r.getStatusCode(), 200); System.out.println(r.getResponseBody()); assertEquals(r.getResponseBody(), "{\"entries\":\"foo - bar - \"}"); c.close(); } @Test(timeOut = 20000) public void testInvalidBookGet() throws Throwable { logger.info("running test: testInvalidBookGet"); AsyncHttpClient c = new AsyncHttpClient(); Response r = c.prepareGet(targetUrl + "/getAddressBook/zeBook").addHeader("Accept", acceptHeader).execute().get(); assertNotNull(r); assertEquals(r.getStatusCode(), 500); c.close(); } @Test(timeOut = 20000) public void testDelete() throws Throwable { logger.info("running test: testGet"); AsyncHttpClient c = new AsyncHttpClient(); c.preparePut(targetUrl + "/createAddressBook/myBook").addHeader("Accept", acceptHeader).setBody("{\"entries\":\"foo - bar - \"}").execute().get(); Response r = c.preparePost(targetUrl + "/updateAddressBook/myBook").addHeader("Accept", acceptHeader).addParameter("update","foo").addParameter("update2", "bar").execute().get(); assertEquals(r.getStatusCode(), 200); c.prepareDelete(targetUrl + "/deleteAddressBook/myBook").addHeader("Accept", acceptHeader).execute().get(); r = c.prepareGet(targetUrl + "/getAddressBook/myBook").addHeader("Accept", acceptHeader).execute().get(); assertNotNull(r); assertEquals(r.getStatusCode(), 500); c.close(); } @Test(timeOut = 20000, enabled = true) public void testInvalidAcceptPut() throws Throwable { logger.info("running test: testInvalidAcceptPut"); AsyncHttpClient c = new AsyncHttpClient(); Response r = c.preparePut(targetUrl + "/createAddressBook/myBook").addHeader("Accept", "foo").setBody("{\"entries\":\"foo - bar - \"}").execute().get(); assertNotNull(r); // TODO: Must return 406, not 500 -> Sitebricks exception try { assertEquals(r.getStatusCode(), 406); } catch (Throwable t) { assertEquals(r.getStatusCode(), 500); } c.close(); } @Test(timeOut = 20000) public void testAcceptPut() throws Throwable { logger.info("running test: testAcceptPut"); AsyncHttpClient c = new AsyncHttpClient(); Response r = c.preparePut(targetUrl + "/createAddressBook/myBook").addHeader("Accept", acceptHeader).setBody("{\"entries\":\"foo - bar - \"}").execute().get(); assertNotNull(r); assertEquals(r.getStatusCode(), 201); c.close(); } @Test(timeOut = 20000, enabled = true) public void testSecondResourceGet() throws Throwable { logger.info("running test: testSecondResourceGet"); AsyncHttpClient c = new AsyncHttpClient(); c.preparePut(targetUrl + "/foo/createAddressBook/myBook").addHeader("Accept", acceptHeader).setBody("{\"entries\":\"foo - bar - \"}").execute().get(); Response r = c.preparePost(targetUrl + "/foo/updateAddressBook/myBook").addHeader("Accept", acceptHeader).addParameter("update","foo").addParameter("update2", "bar").execute().get(); assertEquals(r.getStatusCode(), 200); r = c.prepareGet(targetUrl + "/foo/getAddressBook/myBook").addHeader("Accept", acceptHeader).execute().get(); assertNotNull(r); assertEquals(r.getStatusCode(), 200); System.out.println(r.getResponseBody()); assertEquals(r.getResponseBody(), "{\"entries\":\"foo - bar - \"}"); c.close(); } @Test(timeOut = 20000, enabled = true) public void testGetWithPostBody() throws Throwable { logger.info("running test: testGetWithPostBody"); AsyncHttpClient c = new AsyncHttpClient(); c.preparePut(targetUrl + "/createAddressBook/myBook").addHeader("Accept", acceptHeader).setBody("{\"entries\":\"foo - bar - \"}").execute().get(); c.preparePost(targetUrl + "/updateAddressBook/myBook").addHeader("Accept", acceptHeader).addParameter("update","foo").addParameter("update2", "bar").execute().get(); Response r = c.prepareGet(targetUrl + "/getAddressBook/myBook").addHeader("Accept", acceptHeader).execute().get(); assertNotNull(r); assertEquals(r.getStatusCode(), 200); System.out.println(r.getResponseBody()); assertEquals(r.getResponseBody(), "{\"entries\":\"foo - bar - \"}"); c.close(); } }